Basically there are many ways to do documentation for projects. 2 approaches I've used in the past are 1) Use-Case driven development, and 2) Test driven development. Since i've only used Test driven development once, I'm advising how to use Use-Case driven development.
The key here is to use the UML notation thoroughly. Users, Business Analyst, and Developers speak different languages (obviously) and what you're try to do is make your documentations have meaning. There are 3 basic documents that are key.
Business Specifications - This document is produced by the User, without any interference or consultation with the development team. Why? because this document needs capture purely what the user needs. Example, User wants a program to make coffee. Right now User's coffee machine has to be turned on manually. User's brain takes time to run all cylinders in the morning.
Software Requirement Specification - This is where the analyst breaks down the User requirements into functional specifications. The analyst creates flows based on user's needs. This is where you start using UML. Start with Use-Cases and Activity diagrams to get a picture of how the system is going to feel. Get other derived specifications like security requirements and other needs like infrastructure constraints.
Software Design Description - This is the technical document that the architecture or solution designer produces to design the solution to meet requirements. The architect breaks down the functional specs and translates the flows into technical specs. Each Use-Case can be broken down into Sequence Diagrams and Communication Diagrams. What you can do with these diagrams is start creating the functions for the classes. These diagrams can be used to develop Class Diagrams. State Machines as you may know breaks down Class Diagrams but, I usually don't go that far. You can also document the entire architecture and break down its components in this document using Component Structures. The document can also include the deployment infrastructure that the system is going to be put in.
Using these 3 documents together can help readers better understand how things work in the system. Programmers can understand where the technical specs come from, and how they will eventually need to function. If you can't make a technical spec understandable to programmers in order to make the right functions, might as well tell them how they will ultimately need to function.
To coordinate with teams members from different levels, for example, users, managers, business analyst, solutions architects, and programmers I create a matrix that connects business specs, to functional specs, to technical/design specs. The matrix will also include testing modules that will be coordinated to the elements to be tested. The matrix is really valuable when implementing the V-Model development method.
Matrix Example:
"Business Need A" -> "Functional Spec A" and "Functional Spec B"
"Functional Spec A" -> "Component A", "Component B", and "Component C"
"Component B" -> "Class A" and "Class B"
Of course this always looks better on a spreadsheet.